#ifndef BOX_H
#define BOX_H

#include <QGraphicsRectItem>
#include "link.h"
#include "diagramTextItem.h"
#include "diagram.h"

class diagram;

/*! \class box
    \brief Класс функционального блока
*/
class box : public QGraphicsRectItem
{
public:
	enum { Type = UserType + 8 };
	
	/*! Конструктор блока "по умолчанию".
	*/
	box();
	        
	/*! Конструктор копирования.
        \param Копируемый блок
	*/
	box(const box&);
	        
	/*! Конструктор с параметрами.
        \param pos Позиция блока
		\param width Ширина блока
		\param height Высота блока
		\param _id Идентификатор блока
		\param num Номер блока
		\param scene Указатель на графическую сцену где будет размещен блок
	*/
	box(QPointF pos, qreal width, qreal height,int _id  = 0,int num = 0, QGraphicsScene *scene = 0);
	
	~box();

    int id;                 //!< Идентификатор блока
    QString name;           //!< Название блока
    int number;             //!< Номер блока на диаграмме
    int cost;               //!< Стоимость блока
    QString cost_unit;      //!< Единица измерения стоимости блока
    QList<link*> links;     //!< Cвязи, инцидентные блоку
    diagram* child;         //!< Диаграмма, являющаяся декомпозицией блока

    diagramTextItem *nameField;		//!< Текстовое поле, отображающее название блока
    diagramTextItem *numberField;	//!< Текстовое поле, отображающее номер блока
    diagramTextItem *costField;		//!< Текстовое поле, отображающее стоимость блока

	 diagramTextItem *pNodeField;	//!< Текстовое поле, отображающее стоимость блока

    box& operator=(const box& other);//!< Оператор присваивания

    /*! Определяет тип стрелки, входящей в ближайшую к заданной точке сторону.
		\param p Заданая точка на блоке
		\return Тип стрелки
	*/
    link::ArrowType area(QPointF p);

	/*! Возвращает тип элемента
		\return Тип элемента "блок"
	*/
	int type(void) const{ return Type;}

protected:
    /*! Переопределение стандартного обработчика события элемент изменен.
	*/
	QVariant itemChange ( GraphicsItemChange change, const QVariant & value );

public:
	void correctNodeName(void);		//!< Корректировка положения тектсового поля с именем ноды дочерней диаграммы
    void TextChanged(void);			//!< Синхронизация данных с содержимым текстовых полей
    void FieldChanged(void);		//!< Синхронизация содержимого текстовых полей с данными
};

#endif
